﻿using System.Collections.Generic;
using Jay.Sc2.Bof.Lib.Action.Protoss;
using Jay.Sc2.Bof.Lib.Action.Terran;
using Jay.Sc2.Bof.Lib.Action.Zerg;

namespace Jay.Sc2.Bof.Lib.Action
{
	public class ActionSet : SortedSet<IAction>, IActionSet
	{

		public static ActionSet Terran = new ActionSet();
		public static ActionSet Protoss = new ActionSet();
		public static ActionSet Zerg = new ActionSet();

		public static ActionSet TerranEconomy = new ActionSet();
		public static ActionSet ProtossEconomy = new ActionSet();
		public static ActionSet ZergEconomy = new ActionSet();

		static ActionSet()
		{
			#region Terran
			TerranEconomy.Add(ActionHarvestGasSCV.Instance);
			TerranEconomy.Add(ActionProduceSCV.Instance);
			TerranEconomy.Add(ActionHarvestMinerals.Instance);
			TerranEconomy.Add(ActionProduceRefinery.Instance);
			TerranEconomy.Add(ActionCallMule.Instance);
			TerranEconomy.Add(ActionCallExtraSupplies.Instance);
			TerranEconomy.Add(ActionProduceOrbitalCommand.Instance);
			TerranEconomy.Add(ActionProduceCommandCenter.Instance);
			TerranEconomy.Add(ActionProduceSupplyDepot.Instance);
			// ....
			TerranEconomy.Add(ActionSwitchReactorFromBarracksToFactory.Instance);
			TerranEconomy.Add(ActionSwitchReactorFromBarracksToStarport.Instance);
			TerranEconomy.Add(ActionSwitchReactorFromFactoryToBarracks.Instance);
			TerranEconomy.Add(ActionSwitchReactorFromFactoryToStarport.Instance);
			TerranEconomy.Add(ActionSwitchReactorFromStarportToBarracks.Instance);
			TerranEconomy.Add(ActionSwitchReactorFromStarportToFactory.Instance);
			TerranEconomy.Add(ActionProduceReactorOnBarracks.Instance);
			TerranEconomy.Add(ActionProduceReactorOnFactory.Instance);
			TerranEconomy.Add(ActionProduceReactorOnStarport.Instance);
			// ...
			Terran.Add(ActionHarvestGasSCV.Instance);
			Terran.Add(ActionProduceSCV.Instance);
			Terran.Add(ActionHarvestMinerals.Instance);
			Terran.Add(ActionProduceArmory.Instance);
			Terran.Add(ActionProduceBanshee.Instance);
			Terran.Add(ActionProduceBarracks.Instance);
			Terran.Add(ActionProduceBattlecruiser.Instance);
			Terran.Add(ActionProduceEngineeringBay.Instance);
			Terran.Add(ActionProduceFactory.Instance);
			Terran.Add(ActionProduceFusionCore.Instance);
			Terran.Add(ActionProduceGhost.Instance);
			Terran.Add(ActionProduceGhostAcademy.Instance);
			Terran.Add(ActionProduceMarauder.Instance);
			Terran.Add(ActionProduceMarine.Instance);
			Terran.Add(ActionProduceMedivac.Instance);
			Terran.Add(ActionCallMule.Instance);
			Terran.Add(ActionCallExtraSupplies.Instance);
			Terran.Add(ActionProduceOrbitalCommand.Instance);
			Terran.Add(ActionProducePlanetaryFortress.Instance);
			Terran.Add(ActionProduceReaper.Instance);
			Terran.Add(ActionProduceRefinery.Instance);
			Terran.Add(ActionProduceSiegeTank.Instance);
			Terran.Add(ActionProduceStarport.Instance);
			Terran.Add(ActionProduceSupplyDepot.Instance);
			Terran.Add(ActionProduceThor.Instance);
			Terran.Add(ActionProduceViking.Instance);
			Terran.Add(ActionUpgradeBuildingArmor.Instance);
			Terran.Add(ActionUpgradeCombatShield.Instance);
			Terran.Add(ActionUpgradeConcussiveShells.Instance);
			Terran.Add(ActionUpgradeInfantryWeapons1.Instance);
			Terran.Add(ActionUpgradeInfantryWeapons2.Instance);
			Terran.Add(ActionUpgradeInfantryWeapons3.Instance);
			Terran.Add(ActionUpgradeInfantryArmor1.Instance);
			Terran.Add(ActionUpgradeInfantryArmor2.Instance);
			Terran.Add(ActionUpgradeInfantryArmor3.Instance);
			Terran.Add(ActionUpgradeHiSecAutoTracking.Instance);
			Terran.Add(ActionUpgradeNeosteelFrames.Instance);
			Terran.Add(ActionProduceRaven.Instance);
			Terran.Add(ActionProduceHellion.Instance);
			Terran.Add(ActionUpgradeSiegeTech.Instance);
			Terran.Add(ActionUpgradeStimpack.Instance);
			Terran.Add(ActionUpgradeNitroPacks.Instance);
			Terran.Add(ActionUpgradeInfernalPreIgniter.Instance);
			Terran.Add(ActionUpgradeStrikeCannon.Instance);
			Terran.Add(ActionProduceTechLabOnBarracks.Instance);
			Terran.Add(ActionProduceTechLabOnFactory.Instance);
			Terran.Add(ActionProduceTechLabOnStarport.Instance);
			Terran.Add(ActionProduceReactorOnBarracks.Instance);
			Terran.Add(ActionProduceReactorOnFactory.Instance);
			Terran.Add(ActionProduceReactorOnStarport.Instance);
			Terran.Add(ActionSwitchReactorFromBarracksToFactory.Instance);
			Terran.Add(ActionSwitchReactorFromBarracksToStarport.Instance);
			Terran.Add(ActionSwitchReactorFromFactoryToBarracks.Instance);
			Terran.Add(ActionSwitchReactorFromFactoryToStarport.Instance);
			Terran.Add(ActionSwitchReactorFromStarportToBarracks.Instance);
			Terran.Add(ActionSwitchReactorFromStarportToFactory.Instance);
			Terran.Add(ActionSwitchTechLabFromBarracksToFactory.Instance);
			Terran.Add(ActionSwitchTechLabFromBarracksToStarport.Instance);
			Terran.Add(ActionSwitchTechLabFromFactoryToBarracks.Instance);
			Terran.Add(ActionSwitchTechLabFromFactoryToStarport.Instance);
			Terran.Add(ActionSwitchTechLabFromStarportToBarracks.Instance);
			Terran.Add(ActionSwitchTechLabFromStarportToFactory.Instance);
			Terran.Add(ActionProduceNuke.Instance);
			Terran.Add(ActionUpgradePersonalCloaking.Instance);
			Terran.Add(ActionUpgradeMoebiusReactor.Instance);
			Terran.Add(ActionUpgradeCaduceusReactor.Instance);
			Terran.Add(ActionUpgradeCorvidReactor.Instance);
			Terran.Add(ActionUpgradeDurableMaterials.Instance);
			Terran.Add(ActionUpgradeSeekerMissile.Instance);
			Terran.Add(ActionUpgradeCloakingField.Instance);
			Terran.Add(ActionUpgradeBehemothReactor.Instance);
			Terran.Add(ActionUpgradeWeaponRefit.Instance);
			Terran.Add(ActionUpgradeVehiclePlating1.Instance);
			Terran.Add(ActionUpgradeVehiclePlating2.Instance);
			Terran.Add(ActionUpgradeVehiclePlating3.Instance);
			Terran.Add(ActionUpgradeShipPlating1.Instance);
			Terran.Add(ActionUpgradeShipPlating2.Instance);
			Terran.Add(ActionUpgradeShipPlating3.Instance);
			Terran.Add(ActionUpgradeVehicleWeapons1.Instance);
			Terran.Add(ActionUpgradeVehicleWeapons2.Instance);
			Terran.Add(ActionUpgradeVehicleWeapons3.Instance);
			Terran.Add(ActionUpgradeShipWeapons1.Instance);
			Terran.Add(ActionUpgradeShipWeapons2.Instance);
			Terran.Add(ActionUpgradeShipWeapons3.Instance);
			Terran.Add(ActionProduceCommandCenter.Instance);
			Terran.Add(ActionProduceBunker.Instance);
			Terran.Add(ActionProduceMissileTurret.Instance);
			Terran.Add(ActionProduceSensorTower.Instance);
			Terran.Add(ActionSendScout.Instance);
			Terran.Add(ActionReturnedScout.Instance);
			Terran.Add(ActionDiedScout.Instance);
			#endregion
			#region Protoss
			ProtossEconomy.Add(ActionHarvestGasProbe.Instance);
			ProtossEconomy.Add(ActionProduceProbe.Instance);
			ProtossEconomy.Add(ActionHarvestMinerals.Instance);
			ProtossEconomy.Add(ActionProduceAssimilator.Instance);
			ProtossEconomy.Add(ActionProduceNexus.Instance);
			ProtossEconomy.Add(ActionProducePylon.Instance);
			// ...
			ProtossEconomy.Add(ActionProduceWarpGate.Instance);
			// ...
			Protoss.Add(ActionHarvestGasProbe.Instance);
			Protoss.Add(ActionHarvestMinerals.Instance);
			Protoss.Add(ActionProduceProbe.Instance);
			Protoss.Add(ActionProducePylon.Instance);
			Protoss.Add(ActionProduceAssimilator.Instance);
			Protoss.Add(ActionProduceNexus.Instance);
			Protoss.Add(ActionProduceGateway.Instance);
			Protoss.Add(ActionProduceCyberneticsCore.Instance);
			Protoss.Add(ActionProduceForge.Instance);
			Protoss.Add(ActionProducePhotonCannon.Instance);
			Protoss.Add(ActionProduceRoboticsFacility.Instance);
			Protoss.Add(ActionProduceStargate.Instance);
			Protoss.Add(ActionProduceTwilightCouncil.Instance);
			Protoss.Add(ActionProduceRoboticsBay.Instance);
			Protoss.Add(ActionProduceTemplarArchives.Instance);
			Protoss.Add(ActionProduceDarkShrine.Instance);
			Protoss.Add(ActionProduceFleetBeacon.Instance);
			Protoss.Add(ActionProduceZealot.Instance);
			Protoss.Add(ActionProduceStalker.Instance);
			Protoss.Add(ActionProduceSentry.Instance);
			Protoss.Add(ActionProduceHighTemplar.Instance);
			Protoss.Add(ActionProduceDarkTemplar.Instance);
			Protoss.Add(ActionProduceImmortal.Instance);
			Protoss.Add(ActionProduceObserver.Instance);
			Protoss.Add(ActionProduceWarpPrism.Instance);
			Protoss.Add(ActionProduceColossus.Instance);
			Protoss.Add(ActionProducePhoenix.Instance);
			Protoss.Add(ActionProduceVoidRay.Instance);
			Protoss.Add(ActionProduceCarrier.Instance);
			Protoss.Add(ActionProduceArchon.Instance);
			//Protoss.Add(ActionCallChonoBoostOnGateway.Instance);
			//Protoss.Add(ActionCallChonoBoostOnNexus.Instance);
			//Protoss.Add(ActionCallChonoBoostOnRoboticsFacility.Instance);
			//Protoss.Add(ActionCallChonoBoostOnStargate.Instance);
			Protoss.Add(ActionUpgradeGatewayToWarpGate.Instance);
			Protoss.Add(ActionProduceWarpGate.Instance);
			Protoss.Add(ActionProduceMothership.Instance);
			Protoss.Add(ActionSendScout.Instance);
			Protoss.Add(ActionReturnedScout.Instance);
			Protoss.Add(ActionDiedScout.Instance);
			#endregion
			#region Zerg
			ZergEconomy.Add(ActionHarvestGasDrone.Instance);
			ZergEconomy.Add(ActionProduceDrone.Instance);
			ZergEconomy.Add(ActionHarvestMinerals.Instance);
			ZergEconomy.Add(ActionProduceExtractor.Instance);
			ZergEconomy.Add(ActionExtractorTrick.Instance);
			ZergEconomy.Add(ActionProduceQueen.Instance);
			ZergEconomy.Add(ActionCallSpawnLarvae.Instance);
			ZergEconomy.Add(ActionDoubleExtractorTrick.Instance);
			ZergEconomy.Add(ActionProduceHatchery.Instance);
			ZergEconomy.Add(ActionProduceOverlord.Instance);
			// ...
			Zerg.Add(ActionCallSpawnLarvae.Instance);
			Zerg.Add(ActionHarvestGasDrone.Instance);
			Zerg.Add(ActionHarvestMinerals.Instance);
			Zerg.Add(ActionProduceDrone.Instance);
			Zerg.Add(ActionProduceExtractor.Instance);
			Zerg.Add(ActionProduceHydralisk.Instance);
			Zerg.Add(ActionProduceEvolutionChamber.Instance);
			Zerg.Add(ActionProduceSpawningPool.Instance);
			Zerg.Add(ActionProduceSpineCrawler.Instance);
			Zerg.Add(ActionProduceSporeCrawler.Instance);
			Zerg.Add(ActionProduceOverseer.Instance);
			Zerg.Add(ActionProduceOverlord.Instance);
			Zerg.Add(ActionProduceBanelingNest.Instance);
			Zerg.Add(ActionProduceBaneling.Instance);
			Zerg.Add(ActionProduceZergling.Instance);
			Zerg.Add(ActionProduceGreaterSpire.Instance);
			Zerg.Add(ActionProduceHive.Instance);
			Zerg.Add(ActionProduceHydraliskDen.Instance);
			Zerg.Add(ActionProduceInfestationPit.Instance);
			Zerg.Add(ActionProduceNydusNetwork.Instance);
			Zerg.Add(ActionProduceRoachWarren.Instance);
			Zerg.Add(ActionProduceSpire.Instance);
			Zerg.Add(ActionProduceUltraliskCavern.Instance);
			Zerg.Add(ActionProduceUltralisk.Instance);
			Zerg.Add(ActionProduceBroodLord.Instance);
			Zerg.Add(ActionProduceCorruptor.Instance);
			Zerg.Add(ActionProduceHydralisk.Instance);
			Zerg.Add(ActionProduceInfestor.Instance);
			Zerg.Add(ActionProduceMutalisk.Instance);
			Zerg.Add(ActionProduceOverseer.Instance);
			Zerg.Add(ActionProduceRoach.Instance);
			Zerg.Add(ActionProduceQueen.Instance);
			Zerg.Add(ActionCallSpawnLarvae.Instance);
			Zerg.Add(ActionProduceHatchery.Instance);
			Zerg.Add(ActionExtractorTrick.Instance);
			Zerg.Add(ActionDoubleExtractorTrick.Instance);
			Zerg.Add(ActionSendScout.Instance);
			Zerg.Add(ActionReturnedScout.Instance);
			Zerg.Add(ActionDiedScout.Instance);
			#endregion
		}

		public ActionSet() { }
		public ActionSet(IEnumerable<IAction> collection) : base(collection) { }

	}
}
